
package pd.trabalho.pkg1415;

import java.io.*;
import java.util.*;
import java.net.*;


public class Cliente extends Thread{

    public static final int TIMEOUT = 10; //segundos
    
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Scanner sc = new Scanner(System.in);
        String user, pw, cmd;
        ObjectInputStream in;
        ObjectOutputStream out;
        Socket socket = null;
        Socket sockRep = null;
        Msg msg = new Msg();
        boolean flag = false;
        Object obj;
        int repPort = 0;
        InetAddress repAddr;
        Msg.IP ipRep= msg.new IP();
        
        
        if (args.length != 3){
            System.out.println("Sintaxe: java pd-trabalho-1415 «serverAddress» «serverPort» «fileDirectory»");
            return;
        }
        try{
            
            InetAddress serverAddr = InetAddress.getByName(args[0]);
            int serverPort = Integer.parseInt(args[1]); 
            String fDir = args[2];

            socket = new Socket(serverAddr,serverPort);
            socket.setSoTimeout(TIMEOUT);
            
            in = new ObjectInputStream(socket.getInputStream());
            out = new ObjectOutputStream(socket.getOutputStream());
  
            System.out.println("Introduza o user:");
            user = sc.next();
            System.out.println("Introduza a password");
            pw = sc.next();
            Msg.login login = msg.new login(user,pw);
            
            out.writeObject("file");
            out.flush();

            while(flag){
                ArrayList<Ficheiro> files = (ArrayList)in.readObject();
                System.out.println("------ Lista de Ficheiros ------");
                Iterator it = files.iterator();  
                while (it.hasNext())
                    System.out.println(it.next());
                out.writeObject(login);
                out.flush();
                obj = in.readObject();
                if(obj instanceof Msg){
                    msg = (Msg) obj;
                    System.out.println("Server» "+msg.getCmd());
                    
                }else if (obj instanceof Msg.IP){
                    ipRep = (Msg.IP) obj;
                    repPort = ipRep.getPort();
                    repAddr = InetAddress.getByName(ipRep.getIp());
                    sockRep = new Socket(repAddr, repPort);
                    while(flag){
                        obj = in.readObject();
                        msg = (Msg) obj;
                        System.out.println("Server» "+msg.getCmd());
                        System.out.print("Client» ");
                        cmd=sc.next();
                        if(cmd.equalsIgnoreCase("EXIT"))
                        {
                            flag=true;
                            sockRep.close();
                        }
                        else{
                            msg = new Msg(cmd);
                            out.writeObject(msg);
                            out.flush();
                        }
                    }
                }else{
                    System.out.println("Resposta Invalida!");
                }
                System.out.print("Client» ");
                cmd=sc.next();
                if(cmd.equalsIgnoreCase("EXIT"))
                    flag=true;
                else{
                    msg = new Msg(cmd);
                    out.writeObject(msg);
                    out.flush();
                }
            }
        }catch(UnknownHostException e){
             System.out.println("Destino desconhecido:\n\t"+e);
        }catch(NumberFormatException e){
            System.out.println("O porto do servidor deve ser um inteiro positivo.");
        }catch(SocketTimeoutException e){
            System.out.println("Nao foi recebida qualquer resposta:\n\t"+e);
        }catch(IOException e){
            System.out.println("Ocorreu um erro no acesso ao socket:\n\t"+e);
        }catch(ClassNotFoundException e){
             System.out.println("O objecto recebido nao e' do tipo esperado:\n\t"+e);
        }finally{
            if(socket != null){
                socket.close();
            }
        }
    }
    
}
